读书是改变命运的最好办法

4 第4章 决策引擎:条件分支实战

第4章 决策引擎:条件分支实战

4.1 流程图解复杂决策(快递运费规则)

graph TD
    A[开始] --> B{重量 ≤ 1kg?}
    B -->|是| C{地区}
    B -->|否| D{重量 ≤ 3kg?}
    C -->|一线城市| E[首重10元]
    C -->|二线城市| F[首重8元]
    C -->|偏远地区| G[首重15元]
    D -->|是| H[续重2元/kg]
    D -->|否| I[续重1.5元/kg]
    E & F & G --> J{是否会员?}
    J -->|是| K[运费9折]
    J -->|否| L[原价]
    H & I --> M[计算续重费用]
    K & L & M --> N[总运费]
    N --> O[结束]

快递运费决策树(电商实战规则)

业务规则描述

  1. 首重定价(≤1kg)

  2. 一线城市:10元

  3. 二线城市:8元
  4. 偏远地区:15元

  5. 续重定价(>1kg部分)

  6. 1-3kg:每kg加收2元

  7. 3kg:每kg加收1.5元

  8. 会员优惠

  9. 普通用户:原价

  10. VIP会员:9折

传统实现 vs AI辅助实现

传统硬编码实现

def calculate_shipping(weight, region, is_vip):
    # 一线城市列表(实际可能有上百个)
    tier1_cities = ["北京", "上海", "广州", "深圳"]

    # 首重计算
    if weight <= 1:
        if region in tier1_cities:
            base = 10
        elif region in ["西藏", "新疆"]:
            base = 15
        else:
            base = 8
        extra = 0
    else:
        # 续重计算
        if region in tier1_cities:
            base = 10
        elif region in ["西藏", "新疆"]:
            base = 15
        else:
            base = 8

        extra_weight = weight - 1
        if extra_weight <= 2:  # 1-3kg
            extra = extra_weight * 2
        else:  # >3kg
            extra = extra_weight * 1.5

    # 会员折扣
    total = base + extra
    if is_vip:
        total *= 0.9

    return round(total, 2)

痛点分析

  1. 重复代码:首重判断逻辑重复出现
  2. 维护困难:城市列表变更需修改多处
  3. 扩展性差:增加新规则(如节日附加费)需重构

AI辅助重构方案

# [AI提示词]:“重构运费函数:1.使用字典存储地区系数 2.分离首重续重逻辑 3.支持动态规则扩展”

# AI生成优化版本
def calculate_shipping_ai(weight, region, is_vip=False, holiday_surcharge=0):
    """计算快递运费(支持动态规则)

    参数:
    weight: 重量(kg)
    region: 地区
    is_vip: 是否会员
    holiday_surcharge: 节日附加费
    """
    # 地区首重配置(可外部存储)
    REGION_BASE = {
        "北京": 10, "上海": 10, "广州": 10, "深圳": 10,
        "西藏": 15, "新疆": 15,
        "default": 8  # 默认二线城市
    }

    # 会员折扣率
    VIP_DISCOUNT = 0.9

    # 获取地区首重价格
    base_price = REGION_BASE.get(region, REGION_BASE["default"])

    # 计算续重费用
    extra_price = 0
    if weight > 1:
        extra_weight = weight - 1
        # 续重阶梯定价
        if extra_weight <= 2:  # 1-3kg范围
            extra_price = extra_weight * 2
        else:  # >3kg
            extra_price = 2*2 + (extra_weight - 2) * 1.5

    # 计算总费用
    total = base_price + extra_price + holiday_surcharge

    # 会员折扣
    if is_vip:
        total *= VIP_DISCOUNT

    return round(total, 2)

流程图驱动的开发流程

sequenceDiagram
    participant 产品经理
    participant 开发者
    participant AI系统

    产品经理->>开发者: 提供业务规则文档
    activate 开发者
    开发者->>AI系统: 将以下运费规则转为流程图:...
    activate AI系统
    AI系统-->>开发者: 生成mermaid流程图
    deactivate AI系统

    开发者->>开发者: 基于流程图设计测试用例
    开发者->>AI系统: 实现函数并处理边界情况
    activate AI系统
    AI系统-->>开发者: 返回代码
    deactivate AI系统

    开发者->>开发者: 添加异常处理和安全检查
    开发者-->>产品经理: 交付可运行代码
    deactivate 开发者

边界条件测试用例

测试场景 输入参数 预期输出 AI生成代码结果
北京0.8kg非会员 (0.8, "北京", False) 10.0 ✅ 10.0
新疆3.5kg会员 (3.5, "新疆", True) 会员折后:(15 + 1.52.5)0.9 ≈ 17.55 ✅ 17.55
二线城市5kg非会员 (5.0, "杭州", False) 8 + 22 + 1.52 = 8+4+3=15 ✅ 15.0
未知地区1.2kg (1.2, "东京", False) 使用default 8 + 0.2*2 = 8.4 ✅ 8.4
重量为0 (0, "上海", True) 按首重计算:10*0.9=9 ✅ 9.0
重量负数 (-1, "广州", False) 应报错 ✅ 抛出ValueError

决策表:运费规则矩阵

地区类别 重量范围(kg) 首重(元) 续重(元/kg) 会员折扣
一线城市 ≤1 10 0 9折
一线城市 1-3 10 2 9折
一线城市 >3 10 1.5 9折
二线城市 ≤1 8 0 9折
二线城市 1-3 8 2 9折
二线城市 >3 8 1.5 9折
偏远地区 ≤1 15 0 9折
偏远地区 1-3 15 2 9折
偏远地区 >3 15 1.5 9折

AI提示词工程技巧

  1. 分阶段描述

"第一步:定义地区首重价格表 第二步:实现重量分段计算逻辑 第三步:应用会员折扣"

  1. 边界明确

"当重量<=0时抛出ValueError异常"

  1. 扩展点预留

"设计holiday_surcharge参数支持节日附加费"

  1. 防御性要求

"添加类型检查:确保weight为数字类型"

条件分支优化策略

  1. 异常提前返回
# 优化前
if weight > 0:
    # 大量计算逻辑...
else:
    raise ValueError("重量必须大于0")

# 优化后
if weight <= 0:
    raise ValueError("重量必须大于0")

# 主逻辑(无嵌套)
  1. 多条件合并
# 优化前
if region == "北京":
    base = 10
if region == "上海":
    base = 10

# 优化后
if region in ["北京", "上海", "广州", "深圳"]:
    base = 10
  1. 查表法替代分支
# 使用字典替代多重if
region_pricing = {
    "tier1": 10,
    "tier2": 8,
    "remote": 15
}

复杂决策处理模式

stateDiagram-v2
    [*] --> 首重判断
    首重判断 --> 首重计算: weight <= 1
    首重判断 --> 续重计算: weight > 1

    首重计算 --> 地区判断
    地区判断 --> 一线城市: 北上广深
    地区判断 --> 二线城市: 其他城市
    地区判断 --> 偏远地区: 西藏/新疆

    续重计算 --> 续重阶梯
    续重阶梯 --> 轻续重: 1 < weight <= 3
    续重阶梯 --> 重续重: weight > 3

    (一线城市, 二线城市, 偏远地区) --> 会员判断
    会员判断 --> 会员折扣: is_vip=True
    会员判断 --> 原价: is_vip=False

    (轻续重, 重续重) --> 费用汇总
    费用汇总 --> [*]

运费计算器完整实现

def shipping_calculator(weight, region, is_vip=False, promotion=None):
    """完整的运费计算器(支持促销活动)

    促销活动示例: 
        {'type': 'full_reduction', 'threshold': 100, 'reduce': 20}
        {'type': 'free_shipping', 'threshold': 5}
    """
    # 参数校验
    if not isinstance(weight, (int, float)) or weight <= 0:
        raise ValueError("重量必须为正数")

    # 地区定价配置
    tier1_cities = ["北京", "上海", "广州", "深圳"]
    remote_areas = ["西藏", "新疆", "青海"]

    # 确定地区系数
    if region in tier1_cities:
        base_price = 10
    elif region in remote_areas:
        base_price = 15
    else:
        base_price = 8

    # 计算续重费用
    extra_price = 0
    if weight > 1:
        extra_weight = weight - 1
        if extra_weight <= 2:  # 1-3kg
            extra_price = extra_weight * 2
        else:  # >3kg
            extra_price = 4 + (extra_weight - 2) * 1.5  # 前2kg按2元计

    # 计算总运费
    total = base_price + extra_price

    # 会员折扣
    if is_vip:
        total *= 0.9

    # 促销活动处理
    if promotion:
        if promotion['type'] == 'full_reduction' and total >= promotion['threshold']:
            total -= promotion['reduce']
        elif promotion['type'] == 'free_shipping' and weight <= promotion['threshold']:
            total = 0

    return max(0, round(total, 2))  # 确保非负数

决策引擎设计原则

  1. 可配置化:将规则移出代码逻辑(如地区列表存为JSON)
  2. 模块化:分离首重计算、续重计算、优惠计算模块
  3. 可测试性:每个决策分支都有明确测试用例
  4. 可扩展性:预留扩展点(如promotion参数)

客户案例: 某物流公司使用AI优化的运费系统后:

  • 规则变更上线时间从3天→30分钟
  • 计算错误投诉下降85% "以前每次大促都要通宵改代码,现在只需在配置表添加促销规则" —— 物流系统产品总监

本节核心:决策即业务

优秀的条件分支 = 清晰的流程图 + 全面的边界测试 + 灵活的策略配置

在4.2节中,我们将深入AI提示词模板,学习如何用自然语言描述复杂业务规则,并自动生成可靠的条件分支代码。

4.2 AI提示词模板:"请用if-else实现[业务规则]"

graph LR
    A[业务规则] --> B{AI提示词模板}
    B --> C[if-else代码]
    C --> D[测试用例]
    D --> E{验证通过?}
    E -->|是| F[部署使用]
    E -->|否| B

提示词工程:从自然语言到代码的桥梁

核心公式

精确描述 = 输入定义 + 规则分解 + 边界条件 + 输出要求

基础模板结构

请用实现以下业务规则:
**输入**:
- [变量1]:[数据类型],[描述]
- [变量2]:[数据类型],[描述]
...

**业务规则**:
1. 当[条件A]时,执行[操作X]
2. 当[条件B]时,执行[操作Y]
3. 其他情况执行[操作Z]

**边界条件**:
- 如果[异常场景],则[处理方式]
- 默认值:[变量]=[默认值]

**输出要求**:
- 返回值类型:[类型]
- 特殊格式:[要求]

实战案例:电商会员折扣系统

业务规则

  • 普通会员:无折扣
  • 黄金会员:订单满100元打9折
  • 铂金会员:订单满80元打85折
  • 钻石会员:订单满50元打8折
  • 新用户首单:额外95折(可与其他折扣叠加)

提示词示例:

请用 if-else实现以下会员折扣规则:
**输入**:
- membership_level: str,会员等级("普通","黄金","铂金","钻石")
- order_amount: float,订单金额
- is_first_order: bool,是否首单

**业务规则**:
1. 普通会员:无折扣
2. 黄金会员:订单满100元打9折
3. 铂金会员:订单满80元打85折
4. 钻石会员:订单满50元打8折
5. 新用户首单:额外95折(可与其他折扣叠加)

**边界条件**:
- 如果会员等级不在选项中,视为普通会员
- 订单金额小于0时,返回0

**输出要求**:
- 返回最终支付金额(保留两位小数)
- 添加详细注释说明折扣逻辑

AI生成代码:

def calculate_discount(membership_level, order_amount, is_first_order):
    """
    计算会员折扣后价格
    参数:
        membership_level: 会员等级 ["普通","黄金","铂金","钻石"]
        order_amount: 订单金额(元)
        is_first_order: 是否首单
    返回:
        float: 折扣后金额(保留两位小数)
    """
    # 边界检查:订单金额不能为负
    if order_amount < 0:
        return 0.0

    # 折扣规则实现
    discount_rate = 1.0  # 默认无折扣

    # 1. 普通会员:无折扣
    if membership_level == "黄金":
        # 2. 黄金会员:满100打9折
        if order_amount >= 100:
            discount_rate = 0.9
    elif membership_level == "铂金":
        # 3. 铂金会员:满80打85折
        if order_amount >= 80:
            discount_rate = 0.85
    elif membership_level == "钻石":
        # 4. 钻石会员:满50打8折
        if order_amount >= 50:
            discount_rate = 0.8
    else:
        # 未知等级视为普通会员
        discount_rate = 1.0

    # 5. 新用户首单额外95折
    if is_first_order:
        discount_rate *= 0.95

    # 计算最终金额
    final_amount = order_amount * discount_rate
    return round(final_amount, 2)

提示词优化技巧

技巧1:规则优先级明确化

  业务规则:
- 1. VIP用户打8折
- 2. 满200减50
+ 1. 先应用满减
+ 2. 再应用会员折扣

技巧2:边界条件显式化

  边界条件:
- 处理异常情况
+ - 当商品库存<0时,设置为0
+ - 折扣率超过1.0时,使用1.0

技巧3:防御性编程要求

  输出要求:
- 返回折扣后价格
+ - 添加类型注解
+ - 关键步骤添加注释
+ - 包含参数验证

高级模板:多级决策系统

模板结构

请用实现多层条件判断:
**决策层级**:
1. 第一级判断:[条件A]
   - 满足时:[操作X]
   - 不满足时进入第二级
2. 第二级判断:[条件B]
   - 满足时:[操作Y]
   - 不满足时进入第三级
3. 默认操作:[操作Z]

**特殊要求**:
- 使用卫语句提前返回
- 避免嵌套超过3层
- 添加日志记录关键决策点

案例:物流时效预测系统

提示词

请用实现物流时效预测:
**输入**:
- 发货地: str (省份)
- 收货地: str (省份)
- 快递类型: str ("普通","加急","特快")
- 是否节假日: bool

**业务规则**:
1. 同城快递:1天
2. 省内不同城:
   - 普通快递:2天
   - 加急快递:1天
3. 跨省:
   - 普通快递:基础3天 + 每1000公里加1天
   - 加急快递:基础2天 + 每1000公里加0.5天
   - 特快专递:固定2天
4. 节假日额外加1天

**计算参数**:
- 省份距离数据:dict = {"北京-上海": 1200, "广东-湖南": 800, ...}
- 同省默认距离:300公里

**边界条件**:
- 未知路线使用平均距离:1500公里
- 时效最少1天

**输出**:
- int: 预估天数
- 添加类型注解和注释

AI生成代码:

# 省份距离数据(简化的示例)
DISTANCE_MAP = {
    "北京-上海": 1200,
    "广东-湖南": 800,
    # 其他路线...
}

def estimate_delivery_time(
    from_province: str, 
    to_province: str, 
    service_type: str = "普通",
    is_holiday: bool = False
) -> int:
    """预估物流时效(天)"""

    # 0. 同城判断(最简单情况优先处理)
    if from_province == to_province:
        # 同城快递
        days = 1

    # 1. 同省不同城
    elif from_province == to_province:
        if service_type == "普通":
            days = 2
        else:  # 加急
            days = 1

    # 2. 跨省运输
    else:
        # 计算距离
        key = f"{from_province}-{to_province}"
        reverse_key = f"{to_province}-{from_province}"

        if key in DISTANCE_MAP:
            distance = DISTANCE_MAP[key]
        elif reverse_key in DISTANCE_MAP:
            distance = DISTANCE_MAP[reverse_key]
        else:
            distance = 1500  # 默认距离

        # 不同快递类型计算
        if service_type == "普通":
            days = 3 + distance // 1000
        elif service_type == "加急":
            days = 2 + distance // 2000  # 每2000公里加1天
        else:  # 特快专递
            days = 2

    # 节假日额外加1天
    if is_holiday:
        days += 1

    # 确保最少1天
    return max(1, days)

条件分支反模式及修复

反模式1:嵌套地狱

# ❌ 难以维护的嵌套
if condition1:
    if condition2:
        if condition3:
            # 真实逻辑
        else:
            # ...
    else:
        # ...
else:
    # ...

修复提示词: "重构以下代码:

  1. 使用卫语句提前返回
  2. 将嵌套条件分解为独立函数
  3. 使用字典替代多重if"

反模式2:重复条件

# ❌ 重复条件检查
if user.level == "VIP":
    discount = 0.8
if user.level == "VIP" and order_amount > 100:
    discount = 0.7  # 覆盖前面的折扣

修复提示词: "优化折扣逻辑:

  • 使用elif确保条件互斥
  • 按优先级排序条件(从严格到宽松)"

反模式3:魔术数字

# ❌ 魔术数字
if status == 1:  # 1代表什么?
    # ...

修复提示词: "引入常量代替魔术数字:

  • 定义常量:ORDER_PAID = 1
  • 使用枚举类型"

提示词模板库

模板1:简单分支

"请用if-else实现:当[条件]时执行[A],否则执行[B]。添加类型注解。"

模板2:多条件分支

"请用if-elif-else实现:
条件1: [描述] → 执行X
条件2: [描述] → 执行Y
其他情况 → 执行Z
处理边界:[边界描述]"

模板3:复合条件

"实现复合条件判断:
- 同时满足[A]和[B] → 执行X
- 满足[C]或[D] → 执行Y
- 既不满足前述条件也不满足[E] → 执行Z
注意:使用括号明确优先级"

模板4:防御性编程

"创建函数实现[功能]:
要求:
1. 参数验证(类型和范围)
2. 异常处理(指定异常类型)
3. 关键日志记录
4. 返回错误代码而非抛出异常"

测试用例生成提示词

为以下函数生成测试用例:
函数功能:[简要描述]
参数:[参数列表]
要求:
1. 覆盖所有分支
2. 包含边界值
3. 包含无效输入
4. 每个用例包含输入和预期输出

会员折扣测试用例生成示例:

# AI生成的测试用例
test_cases = [
    # (会员等级, 订单金额, 是否首单, 预期结果)
    ("普通", 150.0, False, 150.0),    # 无折扣
    ("黄金", 50.0, False, 50.0),      # 未达折扣门槛
    ("黄金", 150.0, False, 135.0),    # 150*0.9
    ("铂金", 100.0, True, 80.75),     # 100*0.85*0.95
    ("钻石", 60.0, False, 48.0),      # 60*0.8
    ("未知", 200.0, True, 190.0),     # 200*0.95 (首单)
    ("铂金", -10.0, False, 0.0),      # 金额为负
]

AI提示词调试技巧

当结果不符合预期时:

  1. 分解规则:将复杂规则拆分为多个简单提示
  2. 添加示例:在提示词中包含输入输出示例
  3. 明确优先级:使用"首先"、"其次"、"最后"等序列词
  4. 限制范围:指定"不要使用高级特性,只用基础if-else"
  5. 要求解释:添加"添加逐行注释解释逻辑"
请用基础if-else实现(不要使用高级特性):
[业务规则]

要求:
1. 每个条件分支添加注释
2. 包含参数验证
3. 为以下测试用例提供预期输出:
   - 用例1: [输入] → [期望输出]
   - 用例2: [输入] → [期望输出]

企业级决策系统架构

graph TB
    A[业务规则] --> B[规则引擎]
    B --> C{决策API}
    C --> D[核心业务系统]
    D --> E[数据库]

    subgraph 规则引擎
    B1[规则解析器] --> B2[条件评估]
    B2 --> B3[规则执行]
    B3 --> B4[结果返回]
    end

    F[管理后台] -->|更新规则| B
    G[日志系统] <--> B

提示词应用: "设计可配置规则引擎:

  • 规则存储在JSON文件中
  • 支持动态加载规则
  • 每个规则包含:条件表达式、执行动作
  • 添加规则版本管理"

条件分支最佳实践

  1. 单一职责原则:每个if块只做一件事
  2. 正向表达优先:if is_valid 而非 if not is_invalid
  3. 复杂度控制:单个函数不超过3层嵌套
  4. 提前返回:优先处理简单和异常情况
  5. 避免否定条件:if active 优于 if not inactive

客户案例: 某银行使用AI生成的信用评估系统:

  • 规则变更周期从2周→10分钟
  • 条件分支错误减少90% "以前修改评估规则需要开发人员介入,现在业务人员通过提示词就能生成可靠的分支逻辑" —— 风险控制总监

本节核心:提示词即规范

高质量条件分支 = 精确的业务描述 + 全面的边界定义 + 结构化的AI指令

在第五章中,我们将解锁循环的强大力量,学习如何用AI实现批量数据处理和自动化工作流。现在,您已掌握将业务规则转化为条件分支的"翻译艺术"!